/**
 * Copyright © 2009 Qasky. All rights reserved.
 *
 * 提供各种工具
 *
 * @author Wang Hongya
 * @version 0.0.0 2019/10/14
 *
 * History:
 * (author, date, desc)
 * (Wang Hongya, 20191014, 添加注释)
 */

import {loadSysDictsBySort} from '../api/sysDictApi';

/* 定义工具 */
let util = {};

/*******************************************************************************
 * Function    : title
 * Description : 设置标题栏显示文字
 * Input       : title, 标题栏文字
 * Return      : None
 *******************************************************************************/
util.title = function (title) {
  let name = sessionStorage.getItem('title');
  if(name !== null){
      window.document.title = name
  }else{
      window.document.title = title
  }
};

/*******************************************************************************
 * Function    : inOf
 * Description : 判断是不是包含
 * Input       : arr， 数据
 *               targetArr, 待搜索的路径
 * Return      : true ，包含
 *               false，不包含
 *******************************************************************************/
util.inOf = function (arr, targetArr) {
  let res = true;
  arr.forEach(item => {
    if (targetArr.indexOf(item) < 0) {
      res = false;
    }
  });
  return res;
};

/*******************************************************************************
 * Function    : oneOf
 * Description : 判断是不是包含元素
 * Input       : ele， 元素
 *               targetArr, 待搜索的数据
 * Return      : true ，包含
 *               false，不包含
 *******************************************************************************/
util.oneOf = function (ele, targetArr) {
  return targetArr.indexOf(ele) >= 0;
};

/*******************************************************************************
 * Function    : showThisRoute
 * Description : 是否显示当前地址
 * Input       : itAccess， 地址
 *               currentAccess, 当前地址
 * Return      : 结果
 *******************************************************************************/
util.showThisRoute = function (itAccess, currentAccess) {
  if (typeof itAccess === 'object' && Array.isArray(itAccess)) {
    return util.oneOf(currentAccess, itAccess);
  } else {
    return itAccess === currentAccess;
  }
};

/*******************************************************************************
 * Function    : getRouterObjByName
 * Description : 根据名称获取当前路由
 * Input       : routers， 路由表
 *               name, 名称
 * Return      : 路由
 *******************************************************************************/
util.getRouterObjByName = function (routers, name) {
  if (!name || !routers || !routers.length) {
    return null;
  }
  let routerObj = null;
  for (let item of routers) {
    if (item.name === name) {
      return item;
    }
    routerObj = util.getRouterObjByName(item.children, name);
    if (routerObj) {
      return routerObj;
    }
  }
  return null;
};

/*******************************************************************************
 * Function    : handleTitle
 * Description : 处理标题
 * Input       : vm， 总的 app 的 vue 实例
 *               item， 元素
 * Return      : 标题
 *******************************************************************************/
util.handleTitle = function (vm, item) {
  if (typeof item.title === 'object') {
    return vm.$t(item.title.i18n);
  } else {
    return item.title;
  }
};

/*******************************************************************************
 * Function    : setCurrentPath
 * Description : 设置当前路径
 * Input       : vm， 总的 app 的 vue 实例
 *               name， 名称
 * Return      : 当前路径数组
 *******************************************************************************/
util.setCurrentPath = function (vm, name) {
  let title = '';
  vm.$store.state.app.routers.forEach(item => {
    if (item.children.length === 1) {
      if (item.children[0].name === name) {
        title = util.handleTitle(vm, item);
      }
    } else {
      item.children.forEach(child => {
        if (child.name === name) {
          title = util.handleTitle(vm, child);
        }
      });
    }
  });
  let currentPathArr = [];
  if (name === 'centerSetting') {
    currentPathArr = [
      {
        title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'centerSetting')),
        path: '',
        name: 'centerSetting'
      }
    ];
  } else if ((name.indexOf('_index') >= 0) && name !== 'centerSetting') {
    currentPathArr = [
      {
        title: title,
        path: '',
        name: name
      }
    ];
  } else {
    let currentPathObj = vm.$store.state.app.routers.filter(item => {
      if (item.children.length === 0) {
        return item.name === name;
      } else if (item.children.length <= 1) {
        return item.children[0].name === name;
      } else {
        let i = 0;
        let childArr = item.children;
        let len = childArr.length;
        while (i < len) {
          if (childArr[i].name === name) {
            return true;
          }
          i++;
        }
        return false;
      }
    })[0];
    if (currentPathObj.children.length <= 1 && currentPathObj.name === 'centerSetting') {
      currentPathArr = [
        {
          title: '首页',
          path: '',
          name: 'centerSetting'
        }
      ];
    } else if (currentPathObj.children.length < 1 && currentPathObj.name !== 'centerSetting') {
      currentPathArr = [
        {
          title: currentPathObj.title,
          path: '',
          name: name
        }
      ];
    } else {
      let childObj = currentPathObj.children.filter((child) => {
        return child.name === name;
      })[0];
      currentPathArr = [
        {
          title: currentPathObj.title,
          path: '',
          name: currentPathObj.name
        },
        {
          title: childObj.title,
          path: currentPathObj.path + '/' + childObj.path,
          name: name
        }
      ];
    }
  }
  vm.$store.commit('setCurrentPath', currentPathArr);

  return currentPathArr;
};

/*******************************************************************************
 * Function    : openNewPage
 * Description : 打开新的页面
 * Input       : vm， 总的 app 的 vue 实例
 *               name， 名称
 *               argu， 参数
 *               query， 查询
 * Return      : None
 *******************************************************************************/
util.openNewPage = function (vm, name, argu, query) {
  let pageOpenedList = vm.$store.state.app.pageOpenedList;
  let openedPageLen = pageOpenedList.length;
  let i = 0;
  while (i < openedPageLen) {
    if (name === pageOpenedList[i].name) { // 页面已经打开
      vm.$store.commit('pageOpenedList', {
        index: i,
        argu: argu,
        query: query
      });
      break;
    }
    i++;
  }
  vm.$store.commit('setCurrentPageName', name);
};

/*******************************************************************************
 * Function    : toDefaultPage
 * Description : 跳转至默认界面
 * Input       : routers， 路由表
 *               name， 名称
 *               route， 路由
 *               next， 下一个路由
 * Return      : None
 *******************************************************************************/
util.toDefaultPage = function (routers, name, route, next) {
  let len = routers.length;
  let i = 0;
  let notHandle = true;
  while (i < len) {
    if (routers[i].name === name && routers[i].children && routers[i].redirect === undefined) {
      route.replace({
        name: routers[i].children[0].name
      });
      notHandle = false;
      next();
      break;
    }
    i++;
  }
  if (notHandle) {
    next();
  }
};

/*******************************************************************************
 * Function    : formatObjKeyVal
 * Description : 格式化对象为key=value形式
 * Input       : obj就是对象
 * Return      : None
 *******************************************************************************/
util.formatObjKeyVal = function (obj) {
  if (Object.prototype.toString.call(obj) !== '[object Object]') {
    return;
  }

  let objStr = '';
  for (const key in obj) {
    objStr += '&' + key + '=' + obj[key];
  }
  const newObjStr = objStr.replace('&', '');
  return newObjStr;
};

/*******************************************************************************
 * Function    : formatDateTime
 * Description : 格式化日期
 * Input       : obj就是对象
 * Return      : String
 *******************************************************************************/
util.formatDateTime = function (obj, type) {
  var y = obj.getFullYear();
  var m = obj.getMonth() + 1;
  m = m < 10 ? ('0' + m) : m;
  var d = obj.getDate();
  d = d < 10 ? ('0' + d) : d;
  if (type === 1) {
    var h = obj.getHours();
    h = h < 10 ? ('0' + h) : h;
    var minute = obj.getMinutes();
    minute = minute < 10 ? ('0' + minute) : minute;
    var s = obj.getSeconds();
    s = s < 10 ? ('0' + s) : s;
  } else {
    h = 23;
    minute = 59;
    s = 59;
  }
  return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + s;
};

/*******************************************************************************
 * Function    : formatDateTime
 * Description : 格式化日期
 * Input       : obj就是对象
 * Return      : String
 *******************************************************************************/
util.formatDateTimeForYmd = function (obj1) {
  let obj;
  if (obj1 instanceof Date) {
    obj = obj1;
  } else {
    obj = new Date(obj1);
  }

  var y = obj.getFullYear();
  var m = obj.getMonth() + 1;
  m = m < 10 ? ('0' + m) : m;
  var d = obj.getDate();
  d = d < 10 ? ('0' + d) : d;
  var hour = obj.getHours();
  hour = hour < 10 ? ('0' + hour) : hour;
  var min = obj.getMinutes();
  min = min < 10 ? ('0' + min) : min;
  var sec = obj.getSeconds();
  sec = sec < 10 ? ('0' + sec) : sec;
  return y + '-' + m + '-' + d + " " + [hour, min, sec].join(':');
};

/*******************************************************************************
 * Function    : datetimeFormat
 * Description : 将long类型转化成标准日期格式
 * Input       : Long类型datetime
 * Return      : None
 *******************************************************************************/
util.datetimeFormat = function (datetime) {
  var dateTypeDate = '';
  var date = new Date();
  date.setTime(datetime);
  dateTypeDate += date.getFullYear();
  var m = date.getMonth() + 1;
  dateTypeDate += (m < 10 ? '-0' + m : '-' + m);
  var d = date.getDate();
  dateTypeDate += (d < 10 ? '-0' + d : '-' + d);
  var h = date.getHours();
  dateTypeDate += (h < 10 ? ' 0' + h : ' ' + h);
  var min = date.getMinutes();
  dateTypeDate += (min < 10 ? ':0' + min : ':' + min);
  var s = date.getSeconds();
  dateTypeDate += (s < 10 ? ':0' + s : ':' + s);
  return dateTypeDate;
};


/*******************************************************************************
 * Function    : datetimeFormat
 * Description : 将long类型转化成标准日期格式
 * Input       : Long类型datetime
 * Return      : None
 *******************************************************************************/
util.datetimeFormatYmd = function (datetime) {
  var dateTypeDate = '';
  var date = new Date();
  date.setTime(datetime);
  dateTypeDate += date.getFullYear();
  var m = date.getMonth() + 1;
  dateTypeDate += (m < 10 ? '-0' + m : '-' + m);
  var d = date.getDate();
  dateTypeDate += (d < 10 ? '-0' + d : '-' + d);
  return dateTypeDate;
};


/*******************************************************************************
 * Function    : typeFormat
 * Description : 将long类型转化成标准日期格式
 * Input       : Long类型datetime
 * Return      : None
 *******************************************************************************/
util.typeFormat = function (type) {
  type = parseInt(type);
  if (type === 1) {
    return 'C/C模式充注';
  } else if (type === 2) {
    return 'C/S模式充注';
  } else {
    return '不充注';
  }
};

/*******************************************************************************
 * Function    : hasOperate
 * Description : 页面长时间未操作处理
 * Input       : callback该时间段未点击需要执行的函数, second检测未操作的时间，单位:秒
 * Return      : None
 *******************************************************************************/
util.hasOperate = function (callback, second) {
  var status = true;
  var timer;

  document.body.onmousedown = function () {
    status = true;
  };
  document.body.onmouseup = function () {
    countTime();
  };

  function countTime() {
    setInterval(function () {
      if (!status) {
        callback();
        status = true;
      }
    }, 1000);

    if (timer) {
      clearInterval(timer);
    }

    timer = setInterval(function () {
      status = false;
    }, second);
  }

  countTime();
};

/*******************************************************************************
 * Function    : checkLogin
 * Description : 登录大写锁定等校验
 * Input       : None
 * Return      : None
 *******************************************************************************/
util.checkLogin = function () {
  window.onload = function () {
    let inputPWD = document.getElementById('loginPasswd');
    let capitalFlag = false;
    /*
    let capital = document.getElementById('capital');
    let capitalTip = {
        elem:capital,
        toggle:function(s){
            let sy = this.elem.style;
            let d = sy.display;
            if(s){
                sy.display = s;
            }else{
                sy.display = d ==='none' ? '' : 'none';
            }
        }
    }*/
    let detectCapsLock = function (event) {
      // console.log('down')
      let e = event || window.event;
      let keyCode = e.keyCode || e.which; // 按键的keyCode
      let isShift = e.shiftKey || (keyCode === 16) || false; // shift键是否按住
      if (
        ((keyCode >= 65 && keyCode <= 90) && !isShift) // Caps Lock 打开，且没有按住shift键
        || ((keyCode >= 97 && keyCode <= 122) && isShift)// Caps Lock 打开，且按住shift键
      ) {
        // capitalFlag=true
      }
    }
    inputPWD.onkeydown = detectCapsLock;
    inputPWD.onkeyup = function (event) {
      // console.log('up')
      let e = event || window.event;
      if (e.keyCode === 20 && capitalFlag) {
        // capitalTip.toggle();
        // return false;
      }
    }
  }
};

/*******************************************************************************
 * Function    : fixedProblemIE
 * Description : 处理ie9的一些兼容性问题
 * Input       : none
 * Return      : None
 *******************************************************************************/
util.fixedProblemIE = function (vm) {
  // 处理ie9不支持dataset的属性问题
  if (window.HTMLElement) {
    if (Object.getOwnPropertyNames(HTMLElement.prototype).indexOf('dataset') === -1) {
      Object.defineProperty(HTMLElement.prototype, 'dataset', {
        get: function () {
          let attributes = this.attributes; // 获取节点的所有属性
          let name = [];
          let value = []; // 定义两个数组保存属性名和属性值
          let obj = {}; // 定义一个空对象
          for (let i = 0; i < attributes.length; i++) { // 遍历节点的所有属性
            if (attributes[i].nodeName.slice(0, 5) === 'data-') { // 如果属性名的前面5个字符符合"data-"
              // 取出属性名的"data-"的后面的字符串放入name数组中
              name.push(attributes[i].nodeName.slice(5));
              // 取出对应的属性值放入value数组中
              value.push(attributes[i].nodeValue);
            }
          }
          for (let j = 0; j < name.length; j++) { // 遍历name和value数组
            obj[name[j]] = value[j]; // 将属性名和属性值保存到obj中
          }
          return obj; // 返回对象
        },
      });
    }
  }

  // 处理ie9不是识别classList的问题
  if (!('classList' in document.documentElement)) {
    Object.defineProperty(HTMLElement.prototype, 'classList', {
      get: function () {
        let self = this;

        function update(fn) {
          return function (value) {
            let classes = self.className.split(/\s+/g);
            let index = classes.indexOf(value);

            fn(classes, index, value);
            self.className = classes.join(' ');
          };
        }

        return {
          add: update(function (classes, index, value) {
            if (!~index) classes.push(value);
          }),

          remove: update(function (classes, index) {
            if (~index) classes.splice(index, 1);
          }),

          toggle: update(function (classes, index, value) {
            if (~index) {
              classes.splice(index, 1);
            } else {
              classes.push(value);
            }
          }),

          contains: function (value) {
            return !!~self.className.split(/\s+/g).indexOf(value);
          },

          item: function (i) {
            return self.className.split(/\s+/g)[i] || null;
          },
        };
      },
    });
  }

  // 处理requestAnimationFrame的兼容性问题
  (function () {
    let lastTime = 0;
    let vendors = ['ms', 'moz', 'webkit', 'o'];
    for (let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
      window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
      window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||
        window[vendors[x] + 'CancelRequestAnimationFrame'];
    }

    if (!window.requestAnimationFrame) {
      window.requestAnimationFrame = function (callback, element) {
        let currTime = new Date().getTime();
        let timeToCall = Math.max(0, 16 - (currTime - lastTime));
        let id = window.setTimeout(function () {
            callback(currTime + timeToCall);
          },
          timeToCall);
        lastTime = currTime + timeToCall;
        return id;
      };
    }

    if (!window.cancelAnimationFrame) {
      window.cancelAnimationFrame = function (id) {
        clearTimeout(id);
      };
    }
  }());
};


/*******************************************************************************
 * Function    : changeFillStatus
 * Description : 类型转换
 * Input       : value
 * Return      : None
 *******************************************************************************/
util.changeFillStatus = function (type) {
  if (type === 1) {
    return '充注中';
  } else if (type === 2) {
    return '充注完成';
  } else if (type === 3) {
    return '加载密钥';
  } else if (type === 4) {
    return '本端已充注';
  } else {
    return '未充注';
  }
};

/*******************************************************************************
 * Function    : changeAuthStatus
 * Description : 类型转换
 * Input       : value
 * Return      : None
 *******************************************************************************/
util.changeAuthStatus = function (type) {
  if (type === 1) {
    return '未授权';
  } else if (type === 2) {
    return '已授权';
  } else if (type === 3) {
    return '授权过期';
  } else {
    return '';
  }
};


/*******************************************************************************
 * Function    : getTree
 * Description : 解析变成树
 * Input       : value
 * Return      : None
 *******************************************************************************/
util.getTree = function (tree = []) {
  let arr = [];
  if (!!tree && tree.length !== 0) {
    tree.forEach(item => {
      let obj = {};
      obj.title = item.title;
      obj.id = item.id; // 其他你想要添加的属性
      obj.expand = true;
      //obj.selected = true;
      obj.children = util.getTree(item.children); // 递归调用
      arr.push(obj);
    });
  }
  return arr;
};
/*******************************************************************************
 * Function    : setDeviceListTree
 * Description : 自定义中心树
 * Input       : value
 * Return      : selectedId
 *******************************************************************************/
util.setDeviceListTree = function (tree = []) {
    let arr = [];
    if (!!tree && tree.length !== 0) {
        tree.forEach(item => {
            let obj = {};
            obj.title = item.device.deviceName;
            obj.key = item.device.id;
            obj.value = item.device.id;
            obj.id = item.device.id;
            //obj.selected = true;
            obj.children = util.setDeviceListTree(item.children); // 递归调用
            arr.push(obj);
        });
    }
    return arr;
};
/*******************************************************************************
 * Function    : setTreeCustom
 * Description : 自定义树的格式
 * Input       : value
 * Return      : selectedId
 *******************************************************************************/
util.setTreeCustom = function (tree = []) {
    tree.forEach(item => {
        if (item.children && item.children.length >= 1) {
            item.scopedSlots = {icon: 'custom'}
            util.setTreeCustom(item.children);
        }else{
            item.scopedSlots = {icon: 'copy'}
        }
    });
};
/*******************************************************************************
 * Function    : handleSelectedTree
 * Description : 找到对应节点Id 将selected设置成true 且展开对应父节点
 * Input       : value
 * Return      : selectedId
 *******************************************************************************/
util.handleSelectedTree = function (tree = [], selectedId = '') {
  if (!selectedId) {
    return tree;
  }
  // 递归遍历树
  handleTree(tree, selectedId);
};

function handleTree(tree = [], selectedId = '') {
  let expand = false;
  let atLeastOneExpand = false;
  tree.forEach(item => {
    item.selected = item.id === selectedId;
    if (!expand) {
      expand = item.id === selectedId;
    }
    if (item.children && item.children.length >= 1) {
      let parentExpand = handleTree(item.children, selectedId);
      if (parentExpand) {
        item.expand = true;
        atLeastOneExpand = true;
      }
    }
  });
  return expand || atLeastOneExpand;
}


/*******************************************************************************
 * Function    : unSelectedTree
 * Description : 设置节点selected状态,默认为false
 * Input       : value
 * Return      : selectedId
 *******************************************************************************/
util.setTreeSelected = function (tree = [], state = false) {
  tree.forEach(item => {
    item.selected = state;
    if (item.children && item.children.length >= 1) {
      util.setTreeSelected(item.children, state);
    }
  });
};

/*******************************************************************************
 * Function    : expandedKeysAll
 * Description : 展开所有的节点
 * Input       : value
 * Return      : selectedId
 *******************************************************************************/
util.expandedKeysAll = function (tree = [],checkedList) {
    let arr = checkedList;
    if (!!tree && tree.length !== 0) {
        tree.forEach(item => {
            arr.push(item.key) //todo 把id修改成了key
            util.expandedKeysAll(item.children,arr)
        });
    }
    return arr;
};

/*******************************************************************************
 * Function    : setTreeChecked
 * Description : 设置节点选中状态,默认为false
 * Input       : value
 * Return      : selectedId
 *******************************************************************************/
util.setTreeChecked = function (tree = [],checkedList) {
    let arr = checkedList;
    if (!!tree && tree.length !== 0) {
        tree.forEach(item => {
            if(item.checked){
                arr.push(item.id);
            }
            util.setTreeChecked(item.children,arr)
        });
    }
    return arr;
};


/**
 * 是否有权限
 * @param {*} key
 */
util.hasPermission = function hasPermission(key) {
  return JSON.parse(sessionStorage.getItem('permissions') || '[]').indexOf(key) !== -1 || false
};

util.loadSysDicts = function loadSysDicts(sortCode, values) {
  loadSysDictsBySort({sortCode}).then(res => {
    res.data.forEach(item => {
      values.push(item);
    })
  });
};


util.handleFullScreen = function (exit) {
  let main = document.body;
  if (exit) {
    if (document.exitFullscreen) {
      document.exitFullscreen();
    } else if (document.mozCancelFullScreen) {
      document.mozCancelFullScreen();
    } else if (document.webkitCancelFullScreen) {
      document.webkitCancelFullScreen();
    } else if (document.msExitFullscreen) {
      document.msExitFullscreen();
    }
  } else {
    if (main.requestFullscreen) {
      main.requestFullscreen();
    } else if (main.mozRequestFullScreen) {
      main.mozRequestFullScreen();
    } else if (main.webkitRequestFullScreen) {
      main.webkitRequestFullScreen();
    } else if (main.msRequestFullscreen) {
      main.msRequestFullscreen();
    }
  }
  return true;
};

/*
 *  清除字符的所有空格空格
 */
util.empty = function(val) {
    if (!val || Object.prototype.toString.call(val) !== '[object String]') {
        return val;
    }
    let newVal = '';
    newVal = val.replace(/\s*/g, '');
    return newVal;
};
/*
 *  处理掉部分前台的特殊输入字符
 * */
util.clearSpecialChart = function(val) {
    // 这里先剔除了 %，-， _, 空格这三个特殊字符
    if (!val || Object.prototype.toString.call(val) !== '[object String]') {
        return val;
    }
    let newVal = '';
    newVal = val.replace(/[`~!@#$%^&*()+_=|{}':;.'"",\[\]<>/?~！@#￥%……&*（）——+|{}【】《》 ‘；：”“’。，、？]/ig, '');
    newVal = newVal.replace(/\s+/ig, '');
    if (newVal.length > 30) {
        newVal = newVal.substring(0, 30)
    }
    return newVal;
};
util.clearSpecialChartTwo = function(val) {
    // 这里先剔除了 %，-， _, 空格这三个特殊字符
    if (!val || Object.prototype.toString.call(val) !== '[object String]') {
        return val;
    }
    let newVal = '';
    newVal = val.replace(/[`~!@#$%^&*()+=|{}':;.'"",\[\]<>/?~！@#￥%……&*（）——+|{}【】《》 ‘；：”“’。，、？]/ig, '');
    newVal = newVal.replace(/\s+/ig, '');
    if (newVal.length > 30) {
        newVal = newVal.substring(0, 30)
    }
    return newVal;
};

util.getRamNumber = function (  ) {
    let result= '';
    for(let i=0; i<16 ; i++){
        result+= Math.floor(Math.random()*16).toString(16)
    }
    return result.toLowerCase()
}
util.changeKeyTypeName = function (value, list ) {
    for (let i = 0; i < list.length; i++) {
        if (value && value.toString() === list[ i ].value) {
            return list[ i ].label
        }
    }
    return '-'
}
util.downLoadTxt = function (url,name  ) {
    let a = document.createElement('a')
    a.download = name
    a.rel = 'noopener'
    a.href = url
    a.dispatchEvent(new MouseEvent('click'))
}
export default util;
